#include "seqstack.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "../seqlist/seqlist.h"

#ifndef null
define null NULL
#endif

    extern funSeqList SeqListfunc;

/**
 * 功 能：
 *      创建一个栈
 * 参 数：
 *      capacity：栈的最大容量
 * 返回值：
 *      成功：操作句柄
 *      失败：NULL
 **/
SeqStack *SeqStack_Create(int capacity)
{
    return SeqListfunc.create(capacity);
}
/**
 * 功 能：
 *      销毁一个栈
 * 参 数：
 *      Stack：要操作的栈
 * 返回值：
 *      成功：0
 *      失败：-1
 **/
int SeqStack_Destory(SeqStack *Stack)
{
    return SeqListfunc.destory(Stack);
}
/**
 * 功 能：
 *      清空一个栈
 * 参 数：
 *      Stack：要操作的栈
 * 返回值：
 *      成功：0
 *      失败：-1
 **/
int SeqStack_Clear(SeqStack *Stack)
{
    return SeqListfunc.clear(Stack);
}

/**
 * 功 能：
 *      获取栈的长度
 * 参 数：
 *      Stack：要操作的栈
 * 返回值：
 *      成功：栈的长度
 *      失败：-1
 **/
int SeqStack_Length(SeqStack *Stack)
{
    return SeqListfunc.length(Stack);
}

/**
 * 功 能：
 *      获取栈的最大容量
 * 参 数：
 *      Stack：要操作的栈
 * 返回值：
 *      成功：长得容量
 *      失败：-1
 **/
int SeqStack_Capacity(SeqStack *Stack)
{
    return SeqListfunc.capacity(Stack);
}

/**
 * 功 能：
 *      插入元素
 * 参 数：
 *      Stack：要操作的栈
 *      node : 要插入的元素
 * 返回值：
 *      成功：0
 *      失败：-1
 **/
int SeqStack_Push(SeqStack *Stack, SeqStackNode *node)
{
    return SeqListfunc.insert(Stack, node, SeqListfunc.length(Stack));
}
/**
 * 功 能：
 *      获取栈的元素
 * 参 数：
 *      Stack：要操作的栈
 * 返回值：
 *      成功：操作句柄
 *      失败：NULL
 **/
SeqStackNode *SeqStack_Get(SeqStack *Stack)
{
    return SeqListfunc.get(Stack, SeqListfunc.length(Stack) - 1);
}

/**
 * 功 能：
 *      删除栈
 * 参 数：
 *      Stack：要操作的栈
 * 返回值：
 *      成功：删除后的元素
 *      失败：NULL
 **/
SeqStackNode *SeqStack_Pop(SeqStack *Stack)
{
    return SeqListfunc.delete(Stack, SeqListfunc.length(Stack) - 1);
}

func_SeqStack fun_SeqStack = {
    SeqStack_Create,
    SeqStack_Destory,
    SeqStack_Clear,
    SeqStack_Length,
    SeqStack_Capacity,
    SeqStack_Push,
    SeqStack_Get,
    SeqStack_Pop};
